package com.kl.optional;

import com.kl.model.Address;
import com.kl.model.User;
import org.junit.Test;

import java.util.Optional;

public class OptionalTest {

    // 以前写法
    public String getProvinceOld(User user) throws Exception {
        if (user != null) {
            if (user.getAddress() != null) {
                Address address = user.getAddress();
                if (address.getProvince() != null) {
                    return address.getProvince();
                }
            }
        }
        throw new Exception("取值错误");
    }

    // JAVA8写法
    public String getProvince(User user) throws Exception {
        // 如果user==null，直接返回一个空的Optional对象，不为空则创建一个带user的Optional对象
        // orElseThrow，就是value值为null时，直接抛一个异常出去
        return Optional.ofNullable(user)
                .map(User::getAddress)
                .map(Address::getProvince)
                .orElseThrow(() -> new Exception("取值错误"));
    }

    /**
     * 首先创建了一个value为空的Optional对象
     * 第一次映射为value为空的 Optional<Address>对象
     * 第二次映射为value为空的 Optional<String>对象
     * 最后在 orElseThrow 方法执行时判断 String 对象为null，抛出异常
     */
    @Test
    public void test() {
        try {
            getProvince(null);
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            getProvince(new User());
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            String province = getProvince(new User("kl", 21, new Address("CQ", "yu bei")));
            System.out.println(province);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
